<div class=content>
	<h2>php中的引用(reference)</h2>
	<p>引用做3件事：引用指向、引用传递、引用返回。</p>
	
	
	<h3>引用指向</h3>
<pre>
PHP 的引用允许用两个变量来指向同一个内容。意思是，当这样做时： 
	$a =& $b;
这意味着 $a 和 $b 指向了同一个变量。 

Note: 
$a 和 $b 在这里是完全相同的，这并不是 $a 指向了 $b 或者相反，而是 $a 和 $b 指向了同一个地方。 
</pre>	

	<p>Note: 如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回，则会自动创建该变量。 </p>
	<pre>
Example #1 对未定义的变量使用引用
&lt;?php
function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?&gt;
	</pre>
		
	<h3>引用传递</h3>
	<p>可以将一个变量通过引用传递给函数，这样该函数就可以修改其参数的值。语法如下： </p>
<pre>
//例1：普通变量的引用传递
function foo(&$var){
    $var++;
}

$a=5;
foo($a); // $a is 6 here

//例2：数组变量的引用传递
$arr=array();
$arr['a']=10;

//&表示按地址传递，则函数中修改后，会影响到形式参数
function incre($k,&$arr){
	if(array_key_exists($k,$arr)){
		$arr[$k]++;
	}else{
		$arr[$k]=1;
	}
}

incre('b',$arr);
incre('a',$arr);

print_r($arr);
</pre>

	<p>注意在函数调用时没有引用符号——只有函数定义中有。光是函数定义就足够使参数通过引用来正确传递了。<p>
	
<pre>
以下内容可以通过引用传递： 
	◦变量，例如 foo($a) 
	◦New 语句，例如 foo(new foobar()) 
	◦从函数中返回的引用，例如： 

&lt;?php
function &bar()
{
    $a = 5;
    return $a;
}
foo(bar());
?&gt;
</pre>	





	<h3>引用返回</h3>
	<p>引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能，引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用！要返回引用，使用此语法：</p>
	
<pre>
&lt;?php
class foo {
    public $value = 42;

    public function &getValue() {
        return $this->value;
    }
}

$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue;                // prints the new value of $obj->value, i.e. 2.

//此时，$myValue变量和$obj实例中的私有变量$value(也就是$obj->value)指向同一个值。
</pre>
	
	<p>本例中 getValue 函数所返回的对象的属性将被赋值，而不是拷贝，就和没有用引用语法一样。</p>

	<p><b class=red>Note: 和参数传递不同，这里必须在两个地方都用 & 符号——指出返回的是一个引用，而不是通常的一个拷贝，同样也指出 $myValue 是作为引用的绑定，而不是通常的赋值。</b></p>
	
	<p>Note: 如果试图这样从函数返回引用：return ($this->value);，这将不会起作用，因为在试图返回一个表达式的结果而不是一个引用的变量。只能从函数返回引用变量——没别的方法。如果代码试图返回一个动态表达式或 new 运算符的结果，自 PHP 4.4.0 和 PHP 5.1.0 起会发出一条 E_NOTICE 错误。 </p>
	
	
	
	<h3>取消引用</h3>
	<p>	当 unset 一个引用，只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如：</p> 
<pre>
&lt;?php
$a = 1;
$b =& $a;
unset($a);
?&gt;
//不会 unset $b，只是 $a。 
//再拿这个和 Unix 的 unlink 调用来类比一下可能有助于理解。 
</pre>

	<h3>引用定位</h3>
	<p>许多 PHP 的语法结构是通过引用机制实现的，所以上述有关引用绑定的一切也都适用于这些结构。一些结构，例如引用传递和返回，已经在上面提到了。其它使用引用的结构有：</p> 
	
<pre>
<b>global 引用</b> 
当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的： 
	$var =& $GLOBALS["var"];
这意味着，例如，unset $var 不会 unset 全局变量。 


<b>$this</b> 
在一个对象的方法中，$this 永远是调用它的对象的引用。 
</pre>

	
	
</div>